package com.mashuai.utils.toolkit.core.msThread;

import com.mashuai.utils.toolkit.achieve.MsExegesis;

import java.util.function.Supplier;

/**
 * 线程重试工具。可用于主线程含有事务但未提交，开启子线程去获取值的情况。
 * @className: MsThreadRetryUtils
 * @Description: TODO
 * @author: 马帅
 * @date: 2025/8/6 13:47
 */
public class MsThreadRetryUtils {
    /**
     * 带重试机制的数据库查询
     * @param supplier 查询函数（需返回泛型对象）
     * @param maxRetries 最大重试次数
     * @param retryIntervalMs 重试间隔（毫秒）
     * @return 查询结果（可能为null）
     */
    @MsExegesis("带重试机制的数据库查询(可用于主线程含有事务但未提交，开启子线程去获取值的情况，经多次尝试获取)。maxRetries=最大重试次数，retryIntervalMs=重试间隔（毫秒）")
    public static <T> T retryDbQuery(Supplier<T> supplier, int maxRetries, int retryIntervalMs) {
        T result = null;
        int retryCount = 0;
        while (result == null && retryCount < maxRetries) {
            result = supplier.get();
            if (result == null && retryCount < maxRetries - 1) {
                MsThreadUtils.threadSleep(retryIntervalMs);
            }
            retryCount++;
        }
        return result;
    }
}
